// 这个文件是对axios请求做二次封装的文件
// 在封装完以后，axios就会比不封的功能多，包含统一拦截、进度条控制等
import axios from "axios";
import NProgress from "nprogress";
import "nprogress/nprogress.css";

const instance = axios.create({
  baseURL: "/api", //配置请求基础路径
  timeout: 2000, //配置请求超时时间
});

// 请求和响应拦截器
// 请求拦截器当中添加打开进度条的功能
instance.interceptors.request.use(
  (config) => {
    // 请求拦截器中一般都只处理成功的，因为几乎不会失败
    // 无论是请求拦截器还是响应拦截器，都可以处理两件事件
    // 1.修改请求报文和响应报文
    // 2.添加额外功能
    config.headers = {
      Authorization: "interceptors token",
    }; //增加请求头
    NProgress.start();
    return config; //返回这个config  请求继续发送  发送的报文信息就是新的config对象
  },
  function (error) {
    return Promise.reject(error);
  }
);

//响应拦截器修改响应为直接返回的数据
instance.interceptors.response.use(
  (response) => {
    // 默认返回去的是response 也就是我们的响应报文信息  如果我们要拿到数据  response.data去获取
    // 现在我们是在返回响应之前把响应直接改成了数据，以后我们拿数据不需要再去.data了
    NProgress.done();
    return response.data;
  },
  (error) => {
    NProgress.done();
    alert("发送请求失败：" + error.message || "未知错误");
    // 如果你需要进一步去处理这个错误，那么就返回一个失败的promise
    // return Promise.reject(new Error('请求失败')) //new Error('请求失败')自定义错误消息
    // 如果你不需要再去处理这个错误，那么就返回一个pending状态的promise（终止promise链）
    return new Promise(() => {});
  }
);

export default instance; //暴露出去我们的axios工具  后面发请求使用
